home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / test / tfile.mpp < prev    next >
Encoding:
Text File  |  1993-12-23  |  15.7 KB  |  374 lines

  1. MODULE tfile;
  2. __IMP_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (* Test fuer Module 'file' und 'dir'.
  13.  *
  14.  * Das ist beileibe kein vollstaendiger Test - wenn also bei irgendeiner
  15.  * Prozedur das OK verweigert wird, ist bei der Anpassung auf jeden Fall
  16.  * ein Fehler unterlaufen, ein OK heisst aber lediglich, dass keine
  17.  * offensichtlichen Fehler existieren.
  18.  *
  19.  * hk, 18-Dez-93
  20.  *)
  21.  
  22. VAL_INTRINSIC
  23. CAST_IMPORT
  24.  
  25. FROM SYSTEM IMPORT
  26. (* PROC *) ADR;
  27.  
  28. FROM PORTAB IMPORT
  29. (* CONST*) NULL;
  30.  
  31. FROM types IMPORT
  32. (* CONST*) PATHMAX,
  33. (* TYPE *) PathName, offT, StrPtr;
  34.  
  35. IMPORT e;
  36.  
  37. FROM file IMPORT
  38. (* CONST*) StdoutFileNo, StderrFileNo, fOK, oACCMODE, oRDONLY, oWRONLY, oRDWR,
  39.            sIRWXU, MINHANDLE,
  40. (* TYPE *) FileModes, modeT, AccessModes, AccessMode, OpenModes,
  41.            OpenMode, SeekMode, FDFlags, FDFlag, FcntlCmd, FcntlArg,
  42. (* PROC *) creat, open, fcntl, close, read, write, lseek, dup, dup2, umask,
  43.            chmod, utime, access;
  44.  
  45. FROM term IMPORT
  46. (* PROC *) isatty;
  47.  
  48. FROM dir IMPORT
  49. (* PROC *) getcwd, mkdir, chdir, rmdir, unlink, rename;
  50.  
  51. FROM cstr IMPORT
  52. (* PROC *) strerror;
  53.  
  54. FROM Terminal IMPORT
  55. (* PROC *) Read, Write, WriteString, WriteLn;
  56.  
  57. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  58.  
  59. VAR
  60.   handle  : INTEGER;
  61.   newout  : INTEGER;
  62.   oldout  : INTEGER;
  63.   name    : PathName;
  64.   done    : BOOLEAN;
  65.   ch      : CHAR;
  66.   oldmask : modeT;
  67.   buf     : ARRAY [0..100] OF CHAR;
  68.   farg    : FcntlArg;
  69.  
  70. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  71.  
  72. PROCEDURE ASSERT ((* EIN/ -- *) test : BOOLEAN;
  73.                   (* EIN/ -- *) msg  : ARRAY OF CHAR): BOOLEAN;
  74.  
  75. VAR errstr : ARRAY [0..40] OF CHAR;
  76.  
  77. BEGIN
  78.  WriteString(msg);
  79.  IF test THEN
  80.    WriteString(" -- OK"); WriteLn;
  81.    e.errno := 0;
  82.    RETURN(TRUE);
  83.  ELSE
  84.    strerror(e.errno, errstr); (* Fehler im Klartext ausgeben *)
  85.    WriteString(" **failed**:: "); WriteString(errstr); WriteLn;
  86.    e.errno := 0;
  87.    Read(ch); (* Auf Tastendruck warten *)
  88.    RETURN(FALSE);
  89.  END;
  90. END ASSERT;
  91.  
  92. (*===========================================================================*)
  93.  
  94. BEGIN
  95.  e.errno := 0;
  96.  
  97.  (* Schreibgeschuetzte Datei erzeugen *)
  98.  handle := creat("XYZ12345.TMP", modeT{sIRUSR});
  99.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TMP",modeT{sIRUSR})') THEN
  100.    done := ASSERT(close(handle)=0,'close(handle)');
  101.  END;
  102.  
  103.  (* Datei muss vorhanden sein, aber weder Schreib- noch Ausfuehrberechtigung *)
  104.  done := ASSERT(access("XYZ12345.TMP",fOK)=0,'access("XYZ12345.TMP",fOK)');
  105.  done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})<0,'access("XYZ12345.TMP",AccessMode{wOK})<0');
  106.  done := ASSERT(access("XYZ12345.TMP",AccessMode{xOK})<0,'access("XYZ12345.TMP",AccessMode{xOK})<0');
  107.  WriteLn;
  108.  
  109.  (* Schreibschutz aufheben, Schreibberechtigung muss vorhanden sein *)
  110.  IF ASSERT(chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})=0,'chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})') THEN
  111.    done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})=0,'access("XYZ12345.TMP",AccessMode{wOK})');
  112.  END;
  113.  WriteLn;
  114.  
  115.  (* Datei umbenennen, alter Name darf nicht mehr vorhanden sein, aber der neue *)
  116.  IF ASSERT(rename("XYZ12345.TMP","XYZ54321.TMP")=0,'rename("XYZ12345.TMP","XYZ54321.TMP")') THEN
  117.    done := ASSERT(access("XYZ54321.TMP",fOK)=0,'access("XYZ54321.TMP",fOK)');
  118.    done := ASSERT(access("XYZ12345.TMP",fOK)<0,'access("XYZ12345.TMP",fOK)<0');
  119.  END;
  120.  WriteLn;
  121.  
  122.  (* Datei loeschen, darf nicht mehr vorhanden sein *)
  123.  IF ASSERT(unlink("XYZ54321.TMP")=0,'unlink("XYZ54321.TMP")') THEN
  124.    done := ASSERT(access("XYZ54321.TMP",fOK)<0,'access("XYZ54321.TMP",fOK)<0');
  125.  END;
  126.  WriteLn;
  127.  
  128.  (* Ausfuehrbare Datei erzeugen, Ausfuehrberechtigung muss vorhanden sein *)
  129.  handle := creat("XYZ12345.TTP",sIRWXU);
  130.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TTP",sIRWXU)') THEN
  131.    done := ASSERT(close(handle)=0,'close(handle)');
  132.    done := ASSERT(access("XYZ12345.TTP",AccessMode{xOK})=0,'access("XYZ12345.TTP",AccessMode{xOK})');
  133.    done := ASSERT(unlink("XYZ12345.TTP")=0,'unlink("XYZ12345.TTP")');
  134.  END;
  135.  WriteLn;
  136.  
  137.  (* Dateierstellungsmaske setzen, sodass keine Schreibberechtigung erzeugt
  138.   * werden kann. Datei erzeugen, muss vorhanden, aber schreibgeschuetzt sein.
  139.   * Datei loeschen, alte Maske wiederherstellen.
  140.   *)
  141.  oldmask := umask(modeT{sIWUSR});
  142.  done    := ASSERT(TRUE,'oldmask <- umask(modeT{sIWUSR})');
  143.  handle  := creat("XYZ12345.TMP", sIRWXU);
  144.  IF ASSERT(handle>=0,'handle <- creat("XYZ12345.TMP",sIRWXU)') THEN
  145.    done := ASSERT(close(handle)=0,'close(handle)');
  146.    done := ASSERT(access("XYZ12345.TMP",fOK)=0,'access("XYZ12345.TMP",fOK)');
  147.    done := ASSERT(access("XYZ12345.TMP",AccessMode{wOK})<0,'access("XYZ12345.TMP",AccessMode{wOK})<0');
  148.    done := ASSERT(chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})=0,'chmod("XYZ12345.TMP",modeT{sIRUSR,sIWUSR})');
  149.    done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  150.  END;
  151.  done := ASSERT(umask(oldmask)=modeT{sIWUSR},'umask(oldmask)=modeT{sIWUSR}');
  152.  WriteLn;
  153.  
  154.  (* Zweite Kennung fuer STDOUT erzeugen und wieder freigeben *)
  155.  handle := dup(StdoutFileNo);
  156.  IF ASSERT(handle>StdoutFileNo,'handle <- dup(StdoutFileNo)') THEN
  157.    done := ASSERT(close(handle)=0,'close(handle)');
  158.  END;
  159.  
  160.  (* STDOUT auf STDERR umlenken, Umlenkung wieder rueckgaengig machen *)
  161.  newout := dup(StderrFileNo);
  162.  oldout := dup(StdoutFileNo);
  163.  IF    ASSERT(oldout>StdoutFileNo,'oldout <- dup(StdoutFileNo)')
  164.    AND ASSERT(newout>StderrFileNo,'newout <- dup(StderrFileNo)')
  165.  THEN
  166.    (* Wenn die Ausgabe des Programms auf eine Datei umgelenkt wurde,
  167.     * erscheint die Ausgabe der folgenden Zeile trotzdem auf dem
  168.     * Bildschirm, da 'StdoutFileNo' umgelenkt ist.
  169.     * Das passiert natuerlich nur, wenn 'WriteString' auf "GEMDOS"-Kanal 1
  170.     * ausgibt.
  171.     *)
  172.    IF ASSERT(dup2(newout,StdoutFileNo)>=StdoutFileNo,'dup2(newout,StdoutFileNo)') THEN
  173.      (* Hier wird die Umlenkung wieder rueckgaengig gemacht: *)
  174.      done := ASSERT(dup2(oldout,StdoutFileNo)>=StdoutFileNo,'dup2(oldout,StdoutFileNo)');
  175.      done := ASSERT(close(oldout)=0,'close(oldout)');
  176.      done := ASSERT(close(newout)=0,'close(newout)');
  177.    END;
  178.  END;
  179.  WriteLn;
  180.  
  181.  (* Aktuelles Arbeitsverzeichnis ermitteln *)
  182.  IF ASSERT(getcwd(CAST(StrPtr,ADR(name)),PATHMAX+1)<>NULL,'getcwd(name,PATHMAX+1)') THEN
  183.    WriteString(': name ="'); WriteString(name); Write('"'); WriteLn;
  184.  END;
  185.  
  186.  (* Neues Verzeichnis erzeugen mit Suchberechtigung. Verzeichnis muss vorhanden
  187.   * sein und suchen erlauben. Ins neue Verzeichnis wechseln und neues Arbeits-
  188.   * verzeichnis ermitteln. Wieder zurueck ins alte Arbeitsverzeichnis.
  189.   * Neues Verzeichnis wieder loeschen, darf nicht mehr vorhanden sein.
  190.   *)
  191.  IF ASSERT(mkdir("XYZ12345.DIR",sIRWXU)=0,'mkdir("XYZ12345.DIR",sIRWXU)') THEN
  192.    done := ASSERT(access("XYZ12345.DIR",fOK)=0,'access("XYZ12345.DIR",fOK)');
  193.    done := ASSERT(access("XYZ12345.DIR",AccessMode{xOK})=0,'access("XYZ12345.DIR",AccessMode{xOK})');
  194.    IF ASSERT(chdir("XYZ12345.DIR")=0,'chdir("XYZ12345.DIR")') THEN
  195.      IF ASSERT(getcwd(CAST(StrPtr,ADR(name)),PATHMAX+1)<>NULL,'getcwd(name,PATHMAX+1)') THEN
  196.        WriteString(': name ="'); WriteString(name); Write('"'); WriteLn;
  197.      END;
  198.      done := ASSERT(chdir("..")=0,'chdir("..")');
  199.    END;
  200.    IF ASSERT(rmdir("XYZ12345.DIR")=0,'rmdir("XYZ12345.DIR")') THEN
  201.      done := ASSERT(access("XYZ12345.DIR",fOK)<0,'access("XYZ12345.DIR",fOK)<0');
  202.    END;
  203.  END;
  204.  WriteLn;
  205.  
  206.  (* Datei erzeugen und 10 Zeichen hineinschreiben. Datei nicht mit "creat()"
  207.   * erzeugen, da dann die Datei im ``Nur-Schreib-Modus'' geoeffnet wird, und
  208.   * nicht gelesen werden kann (GEMDOS prueft das nicht ab, aber MiNT!).
  209.   *)
  210.  buf := "12345678901234567890";
  211.  WriteString('buf <- "12345678901234567890"'); WriteLn;
  212.  handle := open("XYZ12345.TMP", oRDWR+OpenMode{oCREAT}, modeT{sIRUSR,sIWUSR});
  213.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT},modeT{sIRUSR,sIWUSR})') THEN
  214.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  215.  END;
  216.  
  217.  (* Schreibzeiger hinter das Ende der Datei positionieren und weitere 10 Bytes
  218.   * schreiben. Nochmal verlaengern und ein Byte schreiben; die aktuelle
  219.   * Position muss mit der Verlaengerung uebereinstimmen. Vom Dateiende 100
  220.   * Bytes zurueckgehen, um zu sehen, ob die Datei tatsaechlich verlaengert
  221.   * wurde.
  222.   *)
  223.  IF ASSERT(INT(lseek(handle,1005,SeekCur))=1015,'lseek(handle,1005,SeekCur)=1015') THEN
  224.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  225.    done := ASSERT(INT(lseek(handle,2999,SeekSet))=2999,'lseek(handle,2999,SeekSet)=2999');
  226.    IF ASSERT(INT(lseek(handle,0,SeekCur))=2999,'lseek(handle,2999,SeekCur)=2999') THEN
  227.      done := ASSERT(INT(write(handle,ADR(buf),1))=1,'write(handle,ADR(buf),1)=1');
  228.      done := ASSERT(INT(lseek(handle,-100,SeekEnd))=2900,'lseek(handle,-100,SeekEnd)=2900');
  229.    END;
  230.  END;
  231.  
  232.  (* Lesezeiger auf die Position, an der zum zweitenmal geschrieben wurde, ein
  233.   * paar Bytes lesen und mit den geschriebenen vergleichen. Datei schliessen.
  234.   *)
  235.  IF ASSERT(INT(lseek(handle,1010,SeekSet))=1010,'lseek(handle,1010,SeekSet)=1010') THEN
  236.    IF ASSERT(INT(read(handle,ADR(buf),10))=10,'read(handle,ADR(buf),10))=10') THEN
  237.      done := ASSERT((buf[3]=0C)AND(buf[4]=0C)AND(buf[5]='1')AND(buf[6]='2'),
  238.                      "buf[3..6] = 0C,0C,'1','2'");
  239.    END;
  240.  END;
  241.  done := ASSERT(close(handle)=0,'close(handle)');
  242.  WriteLn;
  243.  
  244.  (* Feststellen, ob CON: oder STDOUT auf Datei umgelenkt wurden. *)
  245.  WriteString("isatty(-1): ");
  246.  IF isatty(-1) > 0 THEN
  247.    WriteString("ja");
  248.  ELSE
  249.    WriteString("nein");
  250.  END;
  251.  WriteLn;
  252.  WriteString("isatty(StdoutFileNo): ");
  253.  IF isatty(StdoutFileNo) > 0 THEN
  254.    WriteString("ja");
  255.  ELSE
  256.    WriteString("nein");
  257.  END;
  258.  WriteLn;
  259.  WriteLn;
  260.  
  261.  
  262.  (* Vorhandene Testdatei mit Flag O_APPEND oeffnen. Kennung darf nicht
  263.   * fuer ein Terminal gehalten werden; die Anfangsposition muss sich
  264.   * trotz O_APPEND am Anfang der Datei befinden. 10 Bytes schreiben,
  265.   * die aktuelle Position muss sich 10 Bytes hinter dem urspruenglichen
  266.   * Dateiende befinden. An den Dateianfang zurueck und nochmal 10 Bytes
  267.   * schreiben, die akt. Position muss sich 20 bytes hinter dem urspr.
  268.   * Dateiende befinden.
  269.   *)
  270.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oAPPEND},modeT{});
  271.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oAPPEND},modeT{})') THEN
  272.    done := ASSERT(isatty(handle)<=0,'isatty(handle)<=0');
  273.    IF ASSERT(INT(lseek(handle,0,SeekCur))=0,'lseek(handle,0,SeekCur)=0') THEN
  274.      done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  275.      IF ASSERT(INT(lseek(handle,0,SeekCur))=3010,'lseek(handle,0,SeekCur)=3010') THEN
  276.        done:=ASSERT(INT(lseek(handle,0,SeekSet))=0,'lseek(handle,0,SeekSet)=0');
  277.        done:=ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  278.        done:=ASSERT(INT(lseek(handle,0,SeekCur))=3020,'lseek(handle,0,SeekCur)=3020');
  279.      END;
  280.    END;
  281.  END;
  282.  done := ASSERT(close(handle)=0,'close(handle)');
  283.  WriteLn;
  284.  
  285.  (* Vorhandene Testdatei zum Schreiben oeffnen ohne weitere Flags.
  286.   * Flags der Dateikennung erfragen, das 'FdCloExec'-Flag darf nicht gesetzt
  287.   * sein. Flag setzen und pruefen, ob es gesetzt wurde.
  288.   * Flags des Dateibeschreibungsblocks abfragen, der Zugriffsmodus muss
  289.   * oWRONLY sein, und keine weiteren Flags duerfen gesetzt sein.
  290.   * 10 Bytes schreiben, die aktuelle Position muss 10 sein.
  291.   * Zugriffsmodus auf oRDWR setzen und oAPPEND setzen. Flags wieder erfragen,
  292.   * der Zugriffsmodus muss unveraendert oWRONLY sein, aber oAPPEND muss
  293.   * gesetzt sein. Wieder 10 Bytes schreiben, die Datei muss um 10 Bytes
  294.   * verlaengert worden sein.
  295.   *
  296.   * Datei schliessen und loeschen fuer nachfolgenden Test.
  297.   *)
  298.  handle := open("XYZ12345.TMP",oWRONLY+OpenMode{},modeT{});
  299.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oWRONLY+OpenMode{},modeT{})') THEN
  300.    IF ASSERT(fcntl(handle,fGETFD,farg)=0,'fcntl(handle,fGETFD,fdflags)=0') THEN
  301.      done:=ASSERT(NOT(FdCloExec IN farg.fdflags),'NOT(FdCloExec IN fdflags)');
  302.    END;
  303.    farg.fdflags := FDFlag{FdCloExec};
  304.    WriteString('fdflags <- FDFlag{FdCloExec}'); WriteLn;
  305.    IF ASSERT(fcntl(handle,fSETFD,farg)=0,'fcntl(handle,fSETFD,fdflags)=0') THEN
  306.      IF ASSERT(fcntl(handle,fGETFD,farg)=0,'fcntl(handle,fGETFD,fdflags)=0') THEN
  307.        done:=ASSERT(FdCloExec IN farg.fdflags,'FdCloExec IN fdflags');
  308.      END;
  309.    END;
  310.    IF ASSERT(fcntl(handle,fGETFL,farg)=0,'fcntl(handle,fGETFL,mode)=0') THEN
  311.      done:=ASSERT(farg.mode=oWRONLY,'farg.mode = oWRONLY');
  312.    END;
  313.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  314.    done := ASSERT(INT(lseek(handle,0,SeekCur))=10,'lseek(handle,0,SeekCur)=10');
  315.    farg.mode := oRDWR + OpenMode{oAPPEND};
  316.    WriteString('mode <- oRDWR + OpenMode{oAPPEND}'); WriteLn;
  317.    IF ASSERT(fcntl(handle,fSETFL,farg)=0,'fcntl(handle,fSETFL,mode)=0') THEN
  318.      IF ASSERT(fcntl(handle,fGETFL,farg)=0,'fcntl(handle,fGETFL,mode)=0') THEN
  319.        done:=ASSERT(farg.mode*oACCMODE=oWRONLY,'mode * oACCMODE = oWRONLY');
  320.        done:=ASSERT(oAPPEND IN farg.mode,'oAPPEND IN mode');
  321.      END;
  322.      done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10)=10');
  323.      done := ASSERT(INT(lseek(handle,0,SeekCur))=3030,'lseek(handle,0,SeekCur)=3030');
  324.    END;
  325.  END;
  326.  done := ASSERT(close(handle)=0,'close(handle)');
  327.  done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  328.  WriteLn;
  329.  
  330.  (* Ohne Flag O_CREAT darf Datei beim Oeffnen nicht angelegt werden. *)
  331.  handle := open("XYZ12345.TMP",oRDWR,modeT{sIRUSR,sIWUSR});
  332.  IF NOT ASSERT(handle<0,'open("XYZ12345.TMP",oRDWR,modeT{sIRUSR,sIWUSR})<0') THEN
  333.    handle := close(handle);
  334.  END;
  335.  
  336.  (* Datei exklusiv neu anlegen mit Schreibberechtigung. Ein paar Bytes
  337.   * schreiben und wieder schliessen.
  338.   * Nochmal versuchen, exklusiv anzulegen, Datei darf nicht mehr neu angelegt
  339.   * oder gekuerzt werden, da schon vorhanden.
  340.   *)
  341.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIRUSR,sIWUSR});
  342.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIRUSR,sIWUSR})') THEN
  343.    done := ASSERT(INT(write(handle,ADR(buf),10))=10,'write(handle,ADR(buf),10))=10');
  344.    done := ASSERT(close(handle)=0,'close(handle)');
  345.  END;
  346.  handle := open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIWUSR});
  347.  IF NOT ASSERT((handle<0)AND(e.errno=e.EEXIST),'open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT,oEXCL},modeT{sIWUSR})<0') THEN
  348.    handle := close(handle);
  349.  END;
  350.  WriteLn;
  351.  
  352.  (* Datei mit Flag O_CREAT oeffnen, darf dabei aber nicht gekuerzt werden,
  353.   * deshalb Dateilaenge feststellen und wieder schliessen.
  354.   * Datei mit Flag O_TRUNC oeffnen, muss dabei auf Null Bytes gekuerzt werden,
  355.   * deshalb Dateilaenge feststellen und wieder schliessen.
  356.   * Testdatei loeschen.
  357.   *)
  358.  handle := open("XYZ12345.TMP", oRDWR+OpenMode{oCREAT}, modeT{});
  359.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oCREAT},modeT{})') THEN
  360.    done := ASSERT(INT(lseek(handle,0,SeekCur))=0,'lseek(handle,0,SeekCur)=0');
  361.    done := ASSERT(INT(lseek(handle,0,SeekEnd))=10,'lseek(handle,0,SeekEnd))=10');
  362.    done := ASSERT(close(handle)=0,'close(handle)');
  363.  END;
  364.  handle := open("XYZ12345.TMP", oRDWR+OpenMode{oTRUNC}, modeT{});
  365.  IF ASSERT(handle>=0,'handle <- open("XYZ12345.TMP",oRDWR+OpenMode{oTRUNC},modeT{})') THEN
  366.    done := ASSERT(INT(lseek(handle,0,SeekEnd))=0,'lseek(handle,0,SeekEnd)=0');
  367.    done := ASSERT(close(handle)=0,'close(handle)');
  368.    done := ASSERT(unlink("XYZ12345.TMP")=0,'unlink("XYZ12345.TMP")');
  369.  END;
  370.  WriteLn;
  371.  
  372.  Read(ch);
  373. END tfile.
  374.